<?php

/**
 * agenda actions.
 *
 * @package    tfe
 * @subpackage agenda
 * @author     Derboven Jerome
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class agendaActions extends sfActions {

    public function executeIndex(sfWebRequest $request) {
        $this->forward('default', 'module');
    }

    /*
     * Trouve toutes les entrees agenda
     * Type d'entrees :
     *  - Taches
     *  - Evenements
     *
     * Format date puis renvoye en JSON pour etre pris en charge
     * par full calendar
    */
    public function executeTrouverEntreeAgenda(sfWebRequest $request) {

        if (!is_null($request)) {
            // test si la requete est XHR
            if ($request->isXmlHttpRequest()) {
                // requete en GET avec start & end comme param => timestamp
                $startDate = $request->getParameter('start');
                $endDate   = $request->getParameter('end');

                if (!is_null($startDate) && !is_null($endDate)) {
                    if (!empty($startDate) && !empty($endDate)) {
                        $start = date('Y-m-d H:i:s', $startDate);
                        $end   = date('Y-m-d H:i:s', $endDate);

                        // interroger la table TACHE
                        $tacheArray = TacheTable::getTacheParInterval($start, $end);

                        // interroger la table EVENEMENT
                        $evenementArray = EvenementTable::getEvenementParInterval($start, $end);

                        // formater les listes de TACHES & EVENEMENTS en JSON
                        $listeTache = $this->formaterTableau($tacheArray, false);
                        $listeEvenement = $this->formaterTableau($evenementArray, true);

                        // json_encode accepte un array, pas deux
                        // la un choix : concatener ou fusionner
                        // choix = fusionner les tabs puis convertir en JSON
                        $entreeAgenda = array_merge($listeTache, $listeEvenement);

                        // preparer le renvoi des evenements trouves
                        // le content type doit changer car plus HTML mais JSON
                        $this->getResponse()->setHttpHeader('Content-Type','application/json; charset=utf-8');
                        $events = $this->renderText('('.json_encode($entreeAgenda).')');
                    } else {
                        throw new Exception('les dates de début et de fin sont vides');
                    }

                } else {
                    throw new Exception('Date de debut ou de date de fin non recue');
                }

            } else {
                $this->forward404();
            }
        } else {
            throw new Exception('LA requete vaut null');
        }

        return $events;
    }

    public function formaterTableau($array, $isEvenement) {
        if (!is_null($array)) {
            // initialise les events qu'on renverra au modele
            $events = array();

            // formater le tableau pour obtenir les champs mandatory du fullcalendar
            // inclure les helpers pour le url for
            $this->inclureHelpers();
            foreach ($array as $item) {
                if (!$isEvenement) {
                    $events[] = array(
                            'id'          => $item['id'],
                            'title'       => $item['type'],
                            'start'       => $item['date'].' '.$item['heure'],
                            'allDay'      => $this->touteLaJournee($item,false),
                            'url'         => url_for('tache/show?id='.$item['id']),
                            'className'   => 'tache_'.strtolower($item['priorite']),
                            'description' => $item['commentaire']);
                } else {
                    $eventType = $this->recupererTypeEvenement($item);
                    $events[] = array(
                            'id'          => $eventType['id'],
                            'title'       => $item['libelle'],
                            'start'       => $item['date'].' '.$item['heure_de_debut'],
                            'allDay'      => $this->touteLaJournee($item, true),
                            'description' => $item['commentaire'],
                            'url'         => url_for($eventType['moduleURL'].'/show?id='.$eventType['id']),
                            'className'   => 'evenement_'.strtolower($eventType['moduleURL']));
                }
            }
        } else {
            throw new Exception('formaterTableau : tableau valide à fournir !');
        }

        return $events;
    }

    private function recupererTypeEvenement($objetEvenement) {
        $id;
        if (!is_null($objetEvenement) && !empty($objetEvenement)) {
            if ($objetEvenement['id_stage'] != null) {
                $id = array("id" => $objetEvenement['id_stage'],     'moduleURL' => 'stage');
            } else if ($objetEvenement['id_spectacle'] != null) {
                $id = array('id' => $objetEvenement['id_spectacle'], 'moduleURL' => 'spectacle');
            } else if ($objetEvenement['id_atelier'] != null) {
                $id = array('id' => $objetEvenement['id_atelier'],   'moduleURL' => 'atelier');
            } else if ($objetEvenement['id_location'] != null) {
                $id = array('id' => $objetEvenement['id_location'],  'moduleURL' => 'location');
            } else {
                $id = array('id' => $objetEvenement['id'],           'moduleURL' => 'evenement');
            }
        } else {
            throw new Exception('instance d\' evenement est null');
        }

        return $id;
    }

    private function touteLaJournee($item, $isEvenement) {
        $allDay = false;

        if ($isEvenement) {
            // par defaut quand heures non specifiees
            // les heures valent 00:00:00 ..
            if ($item['heure_de_debut'] == $item['heure_de_fin']) {
                $allDay = true;
            }
        } else {
            // test sur l'heure a laquelle effectuer la tache
            // si heure vide, allDay : true
            if (is_null($item['heure']) || empty($item['heure'])) {
                $allDay = true;
            }
        }

        return $allDay;
    }

    public function inclureHelpers() {
        // $this->configuration->loadHelpers('Mail','I18N','Date','Invoice','Number','Url');
        // loader les helpers
        $configuration = sfContext::getInstance()->getConfiguration();
        $configuration->loadHelpers(array('Url'));
    }

    public function executeRender(sfWebRequest $request){;
    }
}